//你有一个数组 nums ，它只包含 正 整数，所有正整数的数位长度都 相同 。 
//
// 两个整数的 数位不同 指的是两个整数 相同 位置上不同数字的数目。 
//
// 请你返回 nums 中 所有 整数对里，数位不同之和。 
//
// 
//
// 示例 1： 
//
// 
// 输入：nums = [13,23,12] 
// 
//
// 输出：4 
//
// 解释： 计算过程如下： - 13 和 23 的数位不同为 1 。 - 13 和 12 的数位不同为 1 。 - 23 和 12 的数位不同为 2 。 所以
//所有整数数对的数位不同之和为 1 + 1 + 2 = 4 。 
//
// 示例 2： 
//
// 
// 输入：nums = [10,10,10,10] 
// 
//
// 输出：0 
//
// 解释： 数组中所有整数都相同，所以所有整数数对的数位不同之和为 0 。 
//
// 
//
// 提示： 
//
// 
// 2 <= nums.length <= 10⁵ 
// 1 <= nums[i] < 10⁹ 
// nums 中的整数都有相同的数位长度。 
// 
//
// Related Topics 数组 哈希表 数学 计数 👍 11 👎 0


package com.tyrone.leetcode.editor.cn;

import com.sun.corba.se.impl.ior.ObjectAdapterIdNumber;

import java.util.Arrays;

public class SumOfDigitDifferencesOfAllPairs {
    public static void main(String[] args) {
        Solution solution = new SumOfDigitDifferencesOfAllPairs().new Solution();
        System.out.println(solution.sumDigitDifferences(new int[]{13, 23, 12}));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 超时了
         */
//        long sum = 0;
//
//        public long sumDigitDifferences(int[] nums) {
//            int n = nums.length;
//            for (int i = 0; i < n-1; i++) {
//                for (int j = i + 1; j < n; j++) {
//                    compare(nums[i], nums[j]);
//                }
//            }
//            return sum;
//        }
//
//        private void compare(int a, int b) {
//            if (a == 0 || b == 0) {
//                sum += a != b ? 1 : 0;
//                return;
//            }
//            while (a != 0) {
//                int x = a % 10;
//                int y = b % 10;
//                sum += x != y ? 1 : 0;
//                a /= 10;
//                b /= 10;
//            }
//        }

        public long sumDigitDifferences(int[] nums) {
            int n = nums.length;
            int m = (int) Math.floor(Math.log10(nums[0])) + 1;
            int[] cnt = new int[10];
            long ans = 0;
            for (int k = 0; k < m; ++k) {
                Arrays.fill(cnt, 0);
                for (int i = 0; i < n; ++i) {
                    ++cnt[nums[i] % 10];
                    nums[i] /= 10;
                }
                for (int i = 0; i < 10; ++i) {
                    ans += 1L * cnt[i] * (n - cnt[i]);
                }
            }
            return ans / 2;
        }

    }
//leetcode submit region end(Prohibit modification and deletion)

}